package io.qar.commons.tools.zookeeper;

import lombok.Data;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
@ConfigurationProperties(prefix = "zookeeper-config")
public class ZookeeperConfig {

    private String connectString;
    private Integer sessionTimeoutMs;
    private Integer connectionTimeoutMs;
    private String namespace;

    private Integer baseSleepTimeMs;
    private Integer maxRetries;
    /**
     * 获取一个CuratorFramework实例。
     * <p>
     * 该方法通过CuratorFrameworkFactory构建一个CuratorFramework客户端，该客户端用于与ZooKeeper进行交互。
     * 使用ExponentialBackoffRetry作为重试策略，以处理连接或操作失败的情况。
     * 设置了会话和连接超时时间，以控制与ZooKeeper服务器的交互时间。
     * 使用命名空间来隔离不同的应用或服务在ZooKeeper中的数据。
     *
     * @return CuratorFramework 客户端实例，用于与ZooKeeper交互。
     */
    public CuratorFramework getClient(){
        // 设置重试策略为指数退避重试，用于在连接或操作失败时进行重试。
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(baseSleepTimeMs, maxRetries);

        // 使用CuratorFrameworkFactory的builder模式构建CuratorFramework客户端。
        // 连接字符串指定ZooKeeper服务器的地址。
        // 会话超时时间和连接超时时间分别指定了与ZooKeeper服务器的会话和连接的超时时间。
        // 重试策略用于在出现连接或操作异常时进行重试。
        // 命名空间用于隔离不同的应用或服务在ZooKeeper中的数据。
        return CuratorFrameworkFactory.builder()
                .connectString(connectString) // ZooKeeper 服务器地址
                .sessionTimeoutMs(sessionTimeoutMs)          // 会话超时时间
                .connectionTimeoutMs(connectionTimeoutMs)       // 连接超时时间
                .retryPolicy(retryPolicy)        // 重试策略
                .namespace(namespace)     // 设置命名空间
                .build();
    }

    public CuratorFramework getStartClient(){
        CuratorFramework client = getClient();
        client.start();
        // 等待客户端启动
        return client;
    }
}